package com.antunnel.common.util;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.util.EntityUtils;


public class CatchWeb {
	private DefaultHttpClient httpclient;
	
	//头信息
	private Header[] headers = {
			//new BasicHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
	};
	/**
	 * 登录地址
	 */
	private String url;
	
	//参数
	private Map<String, String> map = new HashMap<String, String>();
	
	/**
	 * 初始化
	 */
	public CatchWeb() {
		HttpParams params = new BasicHttpParams(); // HttpParams接口代表一个不可以改变的值，定义一个组件运行时行为的集合
		ConnManagerParams.setMaxTotalConnections(params, 100); // 设置允许的最大连接数。（params-HTTP参数
		// maxTotalConnections允许的最大连接数）
		// 过时方法建议使用ThreadSafeClientConnManager.setMaxTotal(int)
		ConnManagerParams.setTimeout(params, 1); // 设置超时时间
		// 建议使用 HttpConnectionParams.setConnectionTimeout(HttpParams, int)
		HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
		// 设置的值CoreProtocolPNames.PROTOCOL_VERSION参数。params - HTTP参数。version -
		// HTTP协议版本。
		// HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_0);
		SchemeRegistry schemeRegistry = new SchemeRegistry();// 创建一个新的空计划注册表
		schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));// 注册计划
		ClientConnectionManager cm = new ThreadSafeClientConnManager(params,schemeRegistry);// 创建一个新线程安全的连接管理器
		// 建议使用ThreadSafeClientConnManager(SchemeRegistry)
		// params -这个经理的参数schreg -计划的注册表
		httpclient = new DefaultHttpClient(cm, params);// 创建一个新的参数的HTTP客户端和连接管理器
		// params -参数conman -连接管理器
		httpclient = new DefaultHttpClient();
	}
	
	public InputStream executeGet() throws Exception {
		HttpGet httpget = new HttpGet(url);// 初始化Post
		List<NameValuePair> nvps = new ArrayList<NameValuePair>(); // 构建参数
		// 增加其他的参数NameValuePair作为HTTP消息的元素的名称/值对参数
		Set<String> set = map.keySet();
		for (String string : set) {
			nvps.add(new BasicNameValuePair(string, map.get(string)));
			// 默认构造函数的名称和值,该值可能为空。name -这个名字。value -值
		}
		// 构造一个新UrlEncodedFormEntity UrlEncodedFormEntity中的参数列表中指定的编码
		// parameters -名称/值对列表
		// encoding -编码的名称/值对编码
		httpget.setHeaders(headers);// 覆盖具有相同名称的第一个标题。 The new header will be
		// appended to the end of the list, if no
		// header with the given name can be
		// found.新的头，将被追加到列表的末尾，可以发现，如果没有具有给定名称的头。

		HttpResponse response = httpclient.execute(httpget); // 运行action执行一个请求，它使用默认的上下文。
		HttpEntity entity = response.getEntity(); // 获得实体
		InputStream instream=null;
		if(entity!=null){
			//System.out.println(EntityUtils.toString(entity));
			instream = entity.getContent();
		}
		//httpclient.getConnectionManager().shutdown();//关闭连接
		//InputStream in = entity.getContent(); // 获得实体的内容
		// 返回一个实体的内容流。创建一个新实例Repeatable InputStream每次调用此方法，因此可以消耗多次Repeatable实体。
		// 实体的不可repeatable预期收益相同InputStream InputStream实例，因此可能不会被消耗掉超过一次。
		// 注意：请注意所有的实体的实现必须确保所有分配的资源后InputStream.close()方法被调用。
		return instream;
	}
	
	public String executeGet(String encoding) throws Exception {
		HttpGet httpget = new HttpGet(url);// 初始化Post
		List<NameValuePair> nvps = new ArrayList<NameValuePair>(); // 构建参数
		// 增加其他的参数NameValuePair作为HTTP消息的元素的名称/值对参数
		Set<String> set = map.keySet();
		for (String string : set) {
			nvps.add(new BasicNameValuePair(string, map.get(string)));
			// 默认构造函数的名称和值,该值可能为空。name -这个名字。value -值
		}
		// 构造一个新UrlEncodedFormEntity UrlEncodedFormEntity中的参数列表中指定的编码
		// parameters -名称/值对列表
		// encoding -编码的名称/值对编码
		httpget.setHeaders(headers);// 覆盖具有相同名称的第一个标题。 The new header will be
		// appended to the end of the list, if no
		// header with the given name can be
		// found.新的头，将被追加到列表的末尾，可以发现，如果没有具有给定名称的头。

		HttpResponse response = httpclient.execute(httpget); // 运行action执行一个请求，它使用默认的上下文。
		HttpEntity entity = response.getEntity(); // 获得实体
		String result=null;
		if(entity!=null){
			//System.out.println(EntityUtils.toString(entity));
			result = EntityUtils.toString(entity,encoding);
		}
		//httpclient.getConnectionManager().shutdown();//关闭连接
		//InputStream in = entity.getContent(); // 获得实体的内容
		// 返回一个实体的内容流。创建一个新实例Repeatable InputStream每次调用此方法，因此可以消耗多次Repeatable实体。
		// 实体的不可repeatable预期收益相同InputStream InputStream实例，因此可能不会被消耗掉超过一次。
		// 注意：请注意所有的实体的实现必须确保所有分配的资源后InputStream.close()方法被调用。
		return result;
	}
	
	public InputStream executePost() throws Exception {
		HttpPost httppost=new HttpPost(url);// 初始化Post
		List<NameValuePair> nvps = new ArrayList<NameValuePair>(); // 构建参数
		// 增加其他的参数NameValuePair作为HTTP消息的元素的名称/值对参数
		Set<String> set = map.keySet();
		for (String string : set) {
			nvps.add(new BasicNameValuePair(string, map.get(string)));
			// 默认构造函数的名称和值,该值可能为空。name -这个名字。value -值
		}
		// 构造一个新UrlEncodedFormEntity UrlEncodedFormEntity中的参数列表中指定的编码
		// parameters -名称/值对列表
		// encoding -编码的名称/值对编码
		httppost.setHeaders(headers);// 覆盖具有相同名称的第一个标题。 The new header will be
		// appended to the end of the list, if no
		// header with the given name can be
		// found.新的头，将被追加到列表的末尾，可以发现，如果没有具有给定名称的头。

		HttpResponse response = httpclient.execute(httppost); // 运行action执行一个请求，它使用默认的上下文。
		HttpEntity entity = response.getEntity(); // 获得实体
		InputStream in=null;
		if(entity!=null){
			in = entity.getContent(); // 获得实体的内容
		}
		//httpclient.getConnectionManager().shutdown();//关闭连接
		// 返回一个实体的内容流。创建一个新实例Repeatable InputStream每次调用此方法，因此可以消耗多次Repeatable实体。
		// 实体的不可repeatable预期收益相同InputStream InputStream实例，因此可能不会被消耗掉超过一次。
		// 注意：请注意所有的实体的实现必须确保所有分配的资源后InputStream.close()方法被调用。
		return in;
	}
	
	public String executePost(String encoding) throws Exception {
		HttpPost httppost=new HttpPost(url);// 初始化Post
		List<NameValuePair> nvps = new ArrayList<NameValuePair>(); // 构建参数
		// 增加其他的参数NameValuePair作为HTTP消息的元素的名称/值对参数
		Set<String> set = map.keySet();
		for (String string : set) {
			nvps.add(new BasicNameValuePair(string, map.get(string)));
			// 默认构造函数的名称和值,该值可能为空。name -这个名字。value -值
		}
		// 构造一个新UrlEncodedFormEntity UrlEncodedFormEntity中的参数列表中指定的编码
		// parameters -名称/值对列表
		// encoding -编码的名称/值对编码
		UrlEncodedFormEntity uefEntity=null;
		if(nvps.size()>0){
			uefEntity=new UrlEncodedFormEntity(nvps,"UTF-8");
		}
		if(uefEntity!=null){
			httppost.setEntity(uefEntity);
		}
		httppost.setHeaders(headers);// 覆盖具有相同名称的第一个标题。 The new header will be
		// appended to the end of the list, if no
		// header with the given name can be
		// found.新的头，将被追加到列表的末尾，可以发现，如果没有具有给定名称的头。

		HttpResponse response = httpclient.execute(httppost); // 运行action执行一个请求，它使用默认的上下文。
		HttpEntity entity = response.getEntity(); // 获得实体
		String result=null;
		if(entity!=null){
			result = EntityUtils.toString(entity,encoding); // 获得实体的内容
		}
		//httpclient.getConnectionManager().shutdown();//关闭连接
		// 返回一个实体的内容流。创建一个新实例Repeatable InputStream每次调用此方法，因此可以消耗多次Repeatable实体。
		// 实体的不可repeatable预期收益相同InputStream InputStream实例，因此可能不会被消耗掉超过一次。
		// 注意：请注意所有的实体的实现必须确保所有分配的资源后InputStream.close()方法被调用。
		return result;
	}
	
	//关闭连接
	public void close(){
		httpclient.getConnectionManager().shutdown();//关闭连接
	}

	public Header[] getHeaders() {
		return headers;
	}

	public void setHeaders(Header[] headers) {
		this.headers = headers;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public Map<String, String> getMap() {
		return map;
	}

	public void setMap(Map<String, String> map) {
		this.map = map;
	}
}
